home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / gus / vts139b.zip / MIXROUTS.INC < prev    next >
Text File  |  1993-12-22  |  14KB  |  433 lines

  1.  
  2.  
  3.  
  4.  
  5. ; ┌──────────────────────────────────────────────────────────────────────────┐
  6. ; │                                                                          │
  7. ; │ MACROS: MonoMix, SterMix, MixoMixSoft & SterMixHard                      │
  8. ; │                                                                          │
  9. ; │ Macros that the mono/stereo mixing.                                      │
  10. ; │                                                                          │
  11. ; │ IN:  AX    = Mono 16 bit sample.                                         │
  12. ; │              Stereo left  channel 16 bit sample.                         │
  13. ; │      BX    = Stereo right channel 16 bit sample.                         │
  14. ; │                                                                          │
  15. ; │ OUT: idem.                                                               │
  16. ; │                                                                          │
  17. ; │ MODIFIES: AX, BX, CX, DX                                                 │
  18. ; │                                                                          │
  19. ; └──────────────────────────────────────────────────────────────────────────┘
  20.  
  21. MACRO MonoMix
  22.  
  23.                 ADD     AX,BX
  24.                 Saturate AX
  25.  
  26. ENDM MonoMix
  27.  
  28. ; ---------------------------------------------------------------------------
  29.  
  30. MACRO SterMix
  31.  
  32.                 ADD     BX,BX
  33.                 Saturate BX
  34.                 ADD     AX,AX
  35.                 Saturate AX
  36.  
  37. ENDM SterMix
  38.  
  39. ; ---------------------------------------------------------------------------
  40.  
  41. MACRO SterMixSoft
  42. LOCAL @@nooverf, @@ovc
  43.  
  44.                 MOV     DX,AX
  45.                 ADD     DX,BX
  46.                 JNO     SHORT @@nooverf
  47.                  RCR    DX,1
  48.                 JMP     SHORT @@ovc
  49. @@nooverf:       SAR    DX,1
  50. @@ovc:
  51.                 ADD     AX,DX
  52.                 Saturate AX
  53.                 ADD     BX,DX
  54.                 Saturate BX
  55.  
  56. ENDM SterMixSoft
  57.  
  58. ; ---------------------------------------------------------------------------
  59.  
  60. MACRO SterMixHard
  61.  
  62.                 SAR     AX,1
  63.                 SAR     BX,1
  64.                 MOV     DX,AX
  65.                 ADD     DX,BX
  66.  
  67.                 MOV     CX,DX
  68.                 SAR     DX,1
  69.  
  70.                 ADD     DX,CX
  71.                 Saturate DX
  72.  
  73.                 ADD     AX,DX
  74.                 Saturate AX
  75.                 ADD     BX,DX
  76.                 Saturate BX
  77.  
  78. ENDM SterMixHard
  79.  
  80.  
  81.  
  82.  
  83. CalcNewMixData:
  84.  
  85.                 ; ┌───────────────────────────────────────────┐
  86.                 ; │ First, calculate the jump from the number │
  87.                 ; │ of channels in the buffer, and store the  │
  88.                 ; │ increment fot rhe next sample in the BX   │
  89.                 ; │ register.                                 │
  90.                 ; └───────────────────────────────────────────┘
  91.  
  92.                 MOV     CX,2 ;[NumChannels]
  93.                 MOV     DX,32
  94.                 SUB     DX,CX
  95.  
  96.                 MOV     BX,DX
  97.                 ADD     DX,DX   ; OJO: Multiply by 3, which is the size of the
  98.                 ADD     DX,BX   ;      ADD rX,[DS:rI+n] instruction.
  99.  
  100.                 ADD     CX,CX
  101.  
  102.                 MOV     [BYTE PTR CS:MixJumpVal-1],DL
  103.                 MOV     [WORD PTR CS:MixAddVal -2],CX
  104.  
  105.  
  106.  
  107.  
  108.                 MOV     BX,DX
  109.                 SUB     BX,OFFSET Mono32MixD1 - OFFSET Mono32MixLoop
  110.                 MOV     [BYTE PTR CS:Mono32MixD1-1],BL
  111.  
  112.                 MOV     BX,DX
  113.                 SUB     BX,OFFSET Ster32MixD1 - OFFSET Ster32MixLoop
  114.                 MOV     [BYTE PTR CS:Ster32MixD1-1],BL
  115.  
  116.                 MOV     [WORD PTR CS:Mono32MixD2  ],CX
  117.                 MOV     [WORD PTR CS:Ster32MixD2  ],CX
  118.  
  119.  
  120.  
  121.  
  122.                 MOV     DL,[MixMethod]
  123.  
  124.                 MOV     BX,OFFSET MixMono   - OFFSET MixMSJumpVal
  125.                 AND     DL,DL
  126.                 JZ      @@ya
  127.  
  128.                 MOV     BX,OFFSET MixSter   - OFFSET MixMSJumpVal
  129.                 DEC     DL
  130.                 JZ      @@ya
  131.  
  132.                 MOV     BX,OFFSET MixStMix1 - OFFSET MixMSJumpVal
  133.                 DEC     DL
  134.                 JZ      @@ya
  135.  
  136.                 MOV     BX,OFFSET MixStMix2 - OFFSET MixMSJumpVal
  137. @@ya:
  138.                 MOV     [WORD PTR CS:MixMSJumpVal-2],BX
  139.  
  140.                 MOV     AH,0C3h
  141.                 MOV     AL,[DoBassPower]
  142.                 AND     AL,AL
  143.                 JZ      @@nobass
  144.                  MOV    AH,90h
  145. @@nobass:       MOV     [BYTE PTR CS:MixMonoBass],AH
  146.                 MOV     [BYTE PTR CS:MixSterBass],AH
  147.  
  148.                 CALL    SetFilterValues
  149.  
  150.                 RET
  151.  
  152.  
  153.  
  154.  
  155. ; ┌──────────────────────────────────────────────────────────────────────────┐
  156. ; │                                                                          │
  157. ; │ ROUTINE: MixChannels                                                     │
  158. ; │                                                                          │
  159. ; │ Mixes up to 32 channels of 16-bit, signed samples into stereo or mono,   │
  160. ; │ and performs all the necessary operations (mixing, equalization,         │
  161. ; │ saturation, etc.)                                                        │
  162. ; │                                                                          │
  163. ; │ IN:  DS:SI = input buffer, where the samples are.                        │
  164. ; │      SS    = Must match the program's data segment.                      │
  165. ; │                                                                          │
  166. ; │ OUT: AX    = Mono 16 bit sample.                                         │
  167. ; │              Stereo left  channel 16 bit sample.                         │
  168. ; │      CX    = Stereo right channel 16 bit sample.                         │
  169. ; │      SI    = Position in the buffer updated.                             │
  170. ; │                                                                          │
  171. ; │ MODIFIES: AX, BX, CX, DX, SI                                             │
  172. ; │                                                                          │
  173. ; └──────────────────────────────────────────────────────────────────────────┘
  174.  
  175. PUBLIC MixChannels
  176.  
  177. MixChannels:
  178.  
  179.                 ; ┌────────────────────────────────────────┐
  180.                 ; │ Now, do the mixing. A jump is used to  │
  181.                 ; │ make faster mixing with less channels. │
  182.                 ; └────────────────────────────────────────┘
  183.  
  184.                 MOV     AX,[SI]
  185.                 XOR     BX,BX
  186.                 JMP     SHORT MixJumpVal
  187. MixJumpVal:
  188.                 ADD     AX,[SI+62]
  189.                 ADD     BX,[SI+60]
  190.                 ADD     BX,[SI+58]
  191.                 ADD     AX,[SI+56]
  192.                 ADD     AX,[SI+54]
  193.                 ADD     BX,[SI+52]
  194.                 ADD     BX,[SI+50]
  195.                 ADD     AX,[SI+48]
  196.                 ADD     AX,[SI+46]
  197.                 ADD     BX,[SI+44]
  198.                 ADD     BX,[SI+42]
  199.                 ADD     AX,[SI+40]
  200.                 ADD     AX,[SI+38]
  201.                 ADD     BX,[SI+36]
  202.                 ADD     BX,[SI+34]
  203.                 ADD     AX,[SI+32]
  204.                 ADD     AX,[SI+30]
  205.                 ADD     BX,[SI+28]
  206.                 ADD     BX,[SI+26]
  207.                 ADD     AX,[SI+24]
  208.                 ADD     AX,[SI+22]
  209.                 ADD     BX,[SI+20]
  210.                 ADD     BX,[SI+18]
  211.                 ADD     AX,[SI+16]
  212.                 ADD     AX,[SI+14]
  213.                 ADD     BX,[SI+12]
  214.                 ADD     BX,[SI+10]
  215.                 ADD     AX,[SI+8]
  216.                 ADD     AX,[SI+6]
  217.                 ADD     BX,[SI+4]
  218.                 ADD     BX,[SI+2]
  219.  
  220.                 ; ┌──────────────────────────────────────────┐
  221.                 ; │ Add the increment to the sample pointer. │
  222.                 ; └──────────────────────────────────────────┘
  223.  
  224.                 ADD     SI,1234h
  225. MixAddVal:
  226.  
  227.                 ; ┌────────────────────────────────────┐
  228.                 ; │ Finally, do the mono/stereo mixing │
  229.                 ; │ and apply the bass-power filter.   │
  230.                 ; └────────────────────────────────────┘
  231.  
  232.                 JMP     NEAR CS:0FFFFh
  233. MixMSJumpVal:
  234.  
  235. MixMono:        MonoMix
  236. MixMonoBass:    NOP
  237.                 JMP     BassPowerMono
  238.  
  239. MixSter:        SterMix
  240.                 JMP     SHORT MixStCommon
  241.  
  242. MixStMix1:      SterMixSoft
  243.                 JMP     SHORT MixStCommon
  244.  
  245. MixStMix2:      SterMixHard
  246.  
  247. MixStCommon:
  248. MixSterBass:    NOP
  249.                 JMP     BassPowerStereo
  250.  
  251.  
  252.  
  253.  
  254. ; ┌──────────────────────────────────────────────────────────────────────────┐
  255. ; │                                                                          │
  256. ; │ ROUTINE: DumpSamples                                                     │
  257. ; │                                                                          │
  258. ; │ This routine fills a portion of buffer with samples.                     │
  259. ; │                                                                          │
  260. ; │ IN:  DS:SI = Source multi-channel buffer.                                │
  261. ; │      ES:DI = Destination buffer.                                         │
  262. ; │      CX    = Number of samples.                                          │
  263. ; │      SS    = Must match the program's data segment.                      │
  264. ; │                                                                          │
  265. ; │ OUT: SI    = Source      final position.                                 │
  266. ; │      DI    = Destination final position.                                 │
  267. ; │                                                                          │
  268. ; │ MODIFIES: AX, BX, CX, DX, SI, DI                                         │
  269. ; │                                                                          │
  270. ; └──────────────────────────────────────────────────────────────────────────┘
  271.  
  272. Picos DB 0
  273.  
  274. GeneralDev8MonoFillRut:
  275.  
  276. Mono32MixRut:
  277.  
  278. ;  SetBorder 0, 0, 0
  279.  
  280. ;PUSH DX
  281. ;MOV DL,[CS:Picos]
  282.  
  283.                 INC     CX
  284.                 JMP     SHORT Mono32MixStartLp
  285.  
  286. Mono32MixLoop:
  287.                 ADD     AX,[SI+62]
  288.                 ADD     BX,[SI+60]
  289.                 ADD     BX,[SI+58]
  290.                 ADD     AX,[SI+56]
  291.                 ADD     AX,[SI+54]
  292.                 ADD     BX,[SI+52]
  293.                 ADD     BX,[SI+50]
  294.                 ADD     AX,[SI+48]
  295.                 ADD     AX,[SI+46]
  296.                 ADD     BX,[SI+44]
  297.                 ADD     BX,[SI+42]
  298.                 ADD     AX,[SI+40]
  299.                 ADD     AX,[SI+38]
  300.                 ADD     BX,[SI+36]
  301.                 ADD     BX,[SI+34]
  302.                 ADD     AX,[SI+32]
  303.                 ADD     AX,[SI+30]
  304.                 ADD     BX,[SI+28]
  305.                 ADD     BX,[SI+26]
  306.                 ADD     AX,[SI+24]
  307.                 ADD     AX,[SI+22]
  308.                 ADD     BX,[SI+20]
  309.                 ADD     BX,[SI+18]
  310.                 ADD     AX,[SI+16]
  311.                 ADD     AX,[SI+14]
  312.                 ADD     BX,[SI+12]
  313.                 ADD     BX,[SI+10]
  314.                 ADD     AX,[SI+8]
  315.                 ADD     AX,[SI+6]
  316.                 ADD     BX,[SI+4]
  317.  
  318.                 ADD     SI,1234h         ; 4*2
  319. Mono32MixD2 = $-2
  320.  
  321. ;ADD SI,2*2
  322.  
  323.                 ADD     AX,BX
  324.                 JO      SHORT Mono32MixSatur
  325.  
  326. Mono32MixCont:   XOR     AH,80h
  327. ;                STOSW
  328. MOV   [BYTE PTR ES:DI],AH
  329. INC   DI
  330.  
  331. ;INC DL
  332.  
  333. Mono32MixStartLp:
  334.                 MOV     AX,[SI]
  335.                 MOV     BX,[SI+2]
  336.  
  337.                 LOOP    SHORT Mono32MixLoop
  338. Mono32MixD1 = $
  339.  
  340. ;  SetBorder 0, 63, 63
  341.  
  342. ;MOV [CS:Picos],DL
  343. ;POP DX
  344.  
  345.                 RET
  346.  
  347.  
  348. Mono32MixSatur: JNS     SHORT @@c1
  349.                  MOV    AX,32767
  350.                 JMP     SHORT Mono32MixCont
  351. @@c1:            MOV    AX,-32767
  352.                 JMP     SHORT Mono32MixCont
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364. GeneralDev16MonoFillRut:
  365. GeneralDev16SterFillRut:
  366. GeneralDev8SterFillRut:
  367.  
  368. Ster32MixRut:
  369.  
  370. ;  SetBorder 0, 0, 0
  371.  
  372.                 INC     CX
  373.                 JMP     SHORT Ster32MixStartLp
  374.  
  375. Ster32MixLoop:
  376.                 ADD     AX,[SI+62]
  377.                 ADD     BX,[SI+60]
  378.                 ADD     BX,[SI+58]
  379.                 ADD     AX,[SI+56]
  380.                 ADD     AX,[SI+54]
  381.                 ADD     BX,[SI+52]
  382.                 ADD     BX,[SI+50]
  383.                 ADD     AX,[SI+48]
  384.                 ADD     AX,[SI+46]
  385.                 ADD     BX,[SI+44]
  386.                 ADD     BX,[SI+42]
  387.                 ADD     AX,[SI+40]
  388.                 ADD     AX,[SI+38]
  389.                 ADD     BX,[SI+36]
  390.                 ADD     BX,[SI+34]
  391.                 ADD     AX,[SI+32]
  392.                 ADD     AX,[SI+30]
  393.                 ADD     BX,[SI+28]
  394.                 ADD     BX,[SI+26]
  395.                 ADD     AX,[SI+24]
  396.                 ADD     AX,[SI+22]
  397.                 ADD     BX,[SI+20]
  398.                 ADD     BX,[SI+18]
  399.                 ADD     AX,[SI+16]
  400.                 ADD     AX,[SI+14]
  401.                 ADD     BX,[SI+12]
  402.                 ADD     BX,[SI+10]
  403.                 ADD     AX,[SI+8]
  404.                 ADD     AX,[SI+6]
  405.                 ADD     BX,[SI+4]
  406.  
  407.                 ADD     SI,1234h         ; 4*2
  408. Ster32MixD2 = $-2
  409.  
  410. Ster32MixCont:   XOR    AH,80h
  411.                  XOR    BH,80h
  412. ;                STOSW
  413. ;                MOV    AX,BX
  414. ;                STOSW
  415. MOV   AL,AH
  416. MOV   AH,BH
  417. MOV   [ES:DI],AX
  418. INC   DI
  419. INC   DI
  420.  
  421. Ster32MixStartLp:
  422.                 MOV     AX,[SI]
  423.                 MOV     BX,[SI+2]
  424.  
  425.                 LOOP    SHORT Ster32MixLoop
  426. Ster32MixD1 = $
  427.  
  428. ;  SetBorder 0, 63, 63
  429.  
  430.                 RET
  431.  
  432.  
  433.